﻿using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;

namespace JoinBoxCurrency
{
    public class GetIpOrSegment
    {
        public string NetworkSegment
        {
            get
            {
                int i1 = IPV4.LastIndexOf(".");//获取字符串最后一个.的位置
                return IPV4.Substring(0, i1);//取当前目录的字符串第一个字符到最后一个.所在位置 
            }
        }
        /// <summary>
        /// 网段
        /// </summary>
        public string IPV4 { get; private set; }
        /// <summary>
        ///  获取本机ip或网段
        /// </summary>
        /// <param name="host">本机ip</param>
        /// <param name="port">端口</param>
        public GetIpOrSegment(string host = null, int? port = null)//"127.0.0.1"
        {
            if (host == null)
            {
                host = "8.8.8.8";
            }
            if (port == null)
            {
                port = PortTool.GetFirstAvailablePort();
            }
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
            {
                socket.Connect(host, port.Value);
                var endPoint = socket.LocalEndPoint as IPEndPoint;
                IPV4 = endPoint.Address.ToString();
            }
        }
    }
    public partial class IntranetPath
    {
        [StructLayout(LayoutKind.Sequential)]
        public class NetResource
        {
            public int dwScope;
            public int dwType;
            public int dwDisplayType;
            public int dwUsage;
            public string LocalName;
            public string RemoteName;
            public string Comment;
            public string provider;
        }
        //[DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true,EntryPoint = "WNetGetConnection")]
        [DllImport("mpr.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int WNetGetConnection
        (
            [MarshalAs(UnmanagedType.LPTStr)] string localName,
            [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName,
            ref int length
        );

        /// <summary>
        /// 映射路径转为网络路径
        /// </summary>
        /// <param name="originalPath">路径</param>
        /// <returns>本地磁盘路径返回与传入参数值一样,网络驱动器路径返回局域网路径</returns>
        /// 例如:给定路径 P:\2008年2月29日(P:为映射的网络驱动器卷标),返回:"//networkserver/照片/2008年2月9日"
        public static string GetUNCPath(string originalPath)
        {
            StringBuilder sb = new StringBuilder(512);
            int size = sb.Capacity;
            if (originalPath.Length > 2 && originalPath[1] == ':')
            {
                char c = originalPath[0];
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
                {
                    int error = WNetGetConnection(originalPath.Substring(0, 2), sb, ref size);
                    if (error == 0)
                    {
                        string path = Path.GetFullPath(originalPath).Substring(Path.GetPathRoot(originalPath).Length);
                        return Path.Combine(sb.ToString().TrimEnd(), path);
                    }
                }
            }
            return originalPath;
        }

        [DllImport("mpr.dll", CharSet = CharSet.Auto, BestFitMapping = false, EntryPoint = "WNetAddConnection2")]
        private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flag);

        /// <summary>
        /// 映射网络驱动器
        /// </summary>
        /// <param name="localName">本地盘符 如U:</param>
        /// <param name="remotePath">远程路经 如\\\\172.18.118.106\\f</param>
        /// <param name="userName">远程服务器用户名</param>
        /// <param name="password">远程服务器密码</param>
        /// <returns>true映射成功，false映射失败</returns>
        public static bool WNetReflectDrive(string localName, string remotePath, string userName, string password)
        {
            NetResource netResource = new NetResource
            {
                dwScope = 2,
                dwType = 0x1,
                dwDisplayType = 3,
                dwUsage = 1,
                LocalName = localName,
                RemoteName = remotePath,
                provider = null
            };
            int ret = WNetAddConnection2(netResource, password, userName, 0);
            if (ret == 0)
            {
                return true;
            }
            return false;
        }

        [DllImport("mpr.dll", CharSet = CharSet.Auto, BestFitMapping = false, EntryPoint = "WNetCancelConnection2")]
        private static extern int WNetCancelConnection2(string lpname, int flag, bool force);
        /// <summary>
        /// 断开网路驱动器
        /// </summary>
        /// <param name="lpName">映射的盘符</param>
        /// <param name="flag">true时如果打开映射盘文件夹，也会断开,返回成功 false时打开映射盘文件夹，返回失败</param>
        /// <returns></returns>
        public static bool WNetDisconnectDrive(string lpName, bool flag)
        {
            int ret = WNetCancelConnection2(lpName, 0, flag);
            if (ret == 0)
            {
                return true;
            }
            return false;
        }
        //https://www.cnblogs.com/190196539/archive/2011/12/20/2294169.html
    }
}